/*
 * 主进程创建2个子进程，在子进程1每隔一秒发送一个usr1信号，
 * 子进程1接收到usr1信号后进入注册信号处理喊叔叔，在屏幕上输出当前时间；
 * 给子进程2每隔一秒发送一个usr2信号，子进程2接收到usr2信号后对一个在主进程中创建的文件进行写入字符操作
 * */

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
//#include <sys/types.h>

#define MAXNUM 1024

#define TRUE 0x01
#define FALSE 0x00

// 定义全局变量
unsigned char flg = FALSE;

// 这是USR1的信号处理函数，用于在屏幕上输出时间信息
void signalDeal1(int iSgl){

	time_t timeval;

	time(&timeval);

	if(iSgl == SIGUSR1){
		printf("%s\n", ctime(&timeval));
	}
}

// 这是USR2的信号处理函数，用于向一个文件中写入字符串
void signalDeal2(int iSgl){
	if(iSgl == SIGUSR2){
		if(flg == FALSE){
			flg = TRUE;
		}
	}
}

int main(int argc, char *argv[]){
	
	// 创建2个进程标识符，用来记录两个子进程的进程号
	pid_t pid1,pid2;

	char writebuf[MAXNUM] = "This is a test!\n";

	// 定义时间参数
	time_t timeval;

	// 定义文件标识符
	int fp, seektemp;

	// 判断输入参数是否正确
	if(argc != 2){
		printf("Please input the current para!");
		return -1;
	}

	// 创建文件*(argv+1)
	fp = open(*(argv+1), O_RDWR|O_CREAT, S_IRWXU);

	if(fp == -1){
		printf("%s文件创建失败!\n", *(argv+1));
		return -2;
	}

	// 创建子进程1
	pid1 = fork();

	if(pid1 == -1){
		printf("子进程1创建失败!\n");
		exit(1);
	}else if(pid1 != 0){
		// 此时为父进程
		printf("此时为子进程1的父进程: %d\n", getpid());
		
		// 创建子进程2
		pid2 = fork();
		
		if(pid2 != 0){
		
			while(1){
				sleep(1);

				printf("此时为子进程2的父进程: %d\n", getpid());
				// 向子进程中发送SIGUSR1信号
				if(kill(pid1, SIGUSR1) == -1){
					printf("父进程向子进程1中发送SIGUSR1失败!\n");
					exit(0);
				}

				if(kill(pid2, SIGUSR2) == -1){
					printf("父进程向子进程2中发送SIGUSR2失败!\n");
					exit(0);
				}
			}
		}else{
			signal(SIGUSR2, signalDeal2);

			while(1){
				// 如果标志为假则等待
				while(flg == FALSE);

				flg = FALSE;

				printf("这是子进程2：%d\n", getpid());

				time(&timeval);
				//ctime(&timeval);
			
				//writebuf[] = ctime(&timeval);		
				//writebuf[strlen(writebuf)] = '\n';
				//j += strlen(writebuf);
				// 获得数据偏移量
				seektemp  = lseek(fp, 0, SEEK_END);

				write(fp, writebuf, strlen(writebuf));
			}
		}
	}else{
		printf("此时为子进程!\n");
		// 子进程1注册SIGUSR1信号
		signal(SIGUSR1, signalDeal1);

		while(1){ }
	}

}

